home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume27 / dmake / part12 < prev    next >
Encoding:
Text File  |  1992-01-29  |  40.0 KB  |  1,298 lines

  1. Newsgroups: comp.sources.misc
  2. From: dvadura@plg.waterloo.edu (Dennis Vadura)
  3. Subject:  v27i113:  dmake - dmake Version 3.8, Part12/41
  4. Message-ID: <1992Jan28.031535.7499@sparky.imd.sterling.com>
  5. X-Md4-Signature: c749321fc726d50296b783d5732c480d
  6. Date: Tue, 28 Jan 1992 03:15:35 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: dvadura@plg.waterloo.edu (Dennis Vadura)
  10. Posting-number: Volume 27, Issue 113
  11. Archive-name: dmake/part12
  12. Environment: Atari-ST, Coherent, Mac, MSDOS, OS/2, UNIX
  13. Supersedes: dmake: Volume 19, Issue 22-58
  14.  
  15. ---- Cut Here and feed the following to sh ----
  16. # this is dmake.shar.12 (part 12 of a multipart archive)
  17. # do not concatenate these parts, unpack them in order with /bin/sh
  18. # file dmake/mac/ruletab.c continued
  19. #
  20. if test ! -r _shar_seq_.tmp; then
  21.     echo 'Please unpack part 1 first!'
  22.     exit 1
  23. fi
  24. (read Scheck
  25.  if test "$Scheck" != 12; then
  26.     echo Please unpack part "$Scheck" next!
  27.     exit 1
  28.  else
  29.     exit 0
  30.  fi
  31. ) < _shar_seq_.tmp || exit 1
  32. if test -f _shar_wnt_.tmp; then
  33. sed 's/^X//' << 'SHAR_EOF' >> 'dmake/mac/ruletab.c' &&
  34. --
  35. -- LOG
  36. --     $Log: ruletab.c,v $
  37. X * Revision 1.1  1992/01/24  03:29:49  dvadura
  38. X * dmake Version 3.8, Initial revision
  39. X *
  40. */
  41. X
  42. /* These are control macros for dmake that MUST be defined at some point
  43. X * if they are NOT dmake will not work!  These are default definitions.  They
  44. X * may be overridden inside the .STARTUP makefile, they are here
  45. X * strictly so that dmake can parse the STARTUP makefile */
  46. X
  47. static char *_rules[] = {
  48. X    "MAXLINELENGTH := 4094",
  49. X    "MAXPROCESSLIMIT := 1",
  50. X    "MAXPROCESS := 1",
  51. X    ".IMPORT .IGNORE: MPW DMSTARTUPDIR",
  52. X    ".MAKEFILES : makefile.mk makefile",
  53. X    ".SOURCE    : .NULL",
  54. #include "startup.h"
  55. X    0 };
  56. X
  57. char **Rule_tab = _rules; /* for sundry reasons in Get_environment() */
  58. X
  59. SHAR_EOF
  60. chmod 0640 dmake/mac/ruletab.c ||
  61. echo 'restore of dmake/mac/ruletab.c failed'
  62. Wc_c="`wc -c < 'dmake/mac/ruletab.c'`"
  63. test 1989 -eq "$Wc_c" ||
  64.     echo 'dmake/mac/ruletab.c: original size 1989, current size' "$Wc_c"
  65. rm -f _shar_wnt_.tmp
  66. fi
  67. # ============= dmake/mac/startup.h ==============
  68. if test -f 'dmake/mac/startup.h' -a X"$1" != X"-c"; then
  69.     echo 'x - skipping dmake/mac/startup.h (File already exists)'
  70.     rm -f _shar_wnt_.tmp
  71. else
  72. > _shar_wnt_.tmp
  73. sed 's/^X//' << 'SHAR_EOF' > 'dmake/mac/startup.h' &&
  74. /* This file contains the default value of the DMMAKESTARTUP variable.
  75. X * You must set the quoted string below to the default path to the startup
  76. X * variable, so that it gets compiled in.  LEAVE DMSTARTUPDIR in
  77. X * the path.  This allows the user to customize his environment for dmake
  78. X * by setting up a new DMSTARTUPDIR environment variable. */
  79. X
  80. "MAKESTARTUP := $(MPW)tools:$(DMSTARTUPDIR)startup.mk",
  81. SHAR_EOF
  82. chmod 0640 dmake/mac/startup.h ||
  83. echo 'restore of dmake/mac/startup.h failed'
  84. Wc_c="`wc -c < 'dmake/mac/startup.h'`"
  85. test 403 -eq "$Wc_c" ||
  86.     echo 'dmake/mac/startup.h: original size 403, current size' "$Wc_c"
  87. rm -f _shar_wnt_.tmp
  88. fi
  89. # ============= dmake/mac/startup.mk ==============
  90. if test -f 'dmake/mac/startup.mk' -a X"$1" != X"-c"; then
  91.     echo 'x - skipping dmake/mac/startup.mk (File already exists)'
  92.     rm -f _shar_wnt_.tmp
  93. else
  94. > _shar_wnt_.tmp
  95. sed 's/^X//' << 'SHAR_EOF' > 'dmake/mac/startup.mk' &&
  96. # MPW Mac startup file.  Customize to suit your needs.
  97. # Assumes MPW C.  Change as req'd.
  98. # See the documentation for a description of internally defined macros.
  99. #
  100. # Disable warnings for macros redefined here that were given
  101. # on the command line.
  102. __.SILENT := $(.SILENT)
  103. .SILENT   := yes
  104. X
  105. # Configuration parameters for DMAKE startup.mk file
  106. # Set these to NON-NULL if you wish to turn the parameter on.
  107. _HAVE_RCS    := yes        # yes => RCS  is installed.
  108. _HAVE_SCCS    :=         # yes => SCCS is installed.
  109. X
  110. # Applicable suffix definitions
  111. A := .lib    # Libraries
  112. C := .c        # C
  113. E :=         # Executables
  114. F := .f        # Fortran
  115. O := .c.o    # Object files: Assume they are created from C files
  116. P := .p        # Pascal
  117. S := .a        # Assembler sources
  118. V := v        # RCS suffix
  119. X
  120. # See if these are defined
  121. TMPDIR := $(MPW)/tmp
  122. .IMPORT .IGNORE : TMPDIR
  123. .IMPORT .IGNORE : CLibraries Libraries
  124. X
  125. # Set arguments for the SHELL.  Since we can't execute sub-processes,
  126. # these variables are not important, except for some makefiles that check
  127. # for some values to determine the platform.
  128. SHELL := mpw
  129. SHELLFLAGS  :=
  130. GROUPFLAGS  :=
  131. SHELLMETAS  :=
  132. GROUPSUFFIX :=
  133. DIVFILE      = $(TMPFILE)
  134. X
  135. # Standard C-language command names and flags
  136. X   CC      := c            # C-compiler and flags
  137. X   CFLAGS  +=
  138. X
  139. X   AS      := asm        # Assembler and flags
  140. X   ASFLAGS +=
  141. X
  142. X   LD       = link        # Loader and flags
  143. X   LDFLAGS +=
  144. X   LDLIBS   = "$(CLibraries)CSANELib.o" "$(CLibraries)Math.o" \
  145. X              "$(CLibraries)StdCLib.o" "$(Libraries)Runtime.o" \
  146. X              "$(Libraries)Interface.o" "$(Libraries)Toollibs.o"
  147. X
  148. # Definition of $(MAKE) macro for recursive makes.
  149. X   MAKE = $(MAKECMD) $(MFLAGS)
  150. X
  151. # Language and Parser generation Tools and their flags
  152. X   YACC      := yacc        # standard yacc
  153. X   YFLAGS +=
  154. X   YTAB      := ytab        # yacc output files name stem.
  155. X
  156. X   LEX      := lex        # standard lex
  157. X   LFLAGS +=
  158. X   LEXYY  := lex_yy        # lex output file
  159. X
  160. # Other Compilers, Tools and their flags
  161. X   PC    := any_pc        # pascal compiler
  162. X   RC    := anyf77        # ratfor compiler
  163. X   FC    := anyf77        # fortran compiler
  164. X
  165. X   CO       := co        # check out for RCS
  166. X   COFLAGS += -q
  167. X
  168. X   RM       := delete    # remove a file command
  169. X   RMFLAGS +=
  170. X
  171. # Implicit generation rules for making inferences.
  172. # We don't provide .yr or .ye rules here.  They're obsolete.
  173. # Rules for making *$O
  174. X   %$C.o : %$C ; $(CC) $(CFLAGS) -c $<
  175. X   %$P.o : %$P ; $(PC) $(PFLAGS) -c $<
  176. X   %$S.o : %$S ; $(AS) $(ASFLAGS) $(<:s,/,\);
  177. X   %$F.o : %$F ; $(FC) $(RFLAGS) $(EFLAGS) $(FFLAGS) -c $<
  178. X
  179. # Executables rules should go here.  However, on the Mac, there is not
  180. # executable suffix (such as ".exe") and thus we end up with rules like
  181. # "% : %.c.o", which cause circular-dependency errors.  Thus, it's easier
  182. # just to avoid specifiying any default rule for executables.
  183. X
  184. # lex and yacc rules
  185. X   %.c : %.y ; $(YACC)  $(YFLAGS) $<; mv $(YTAB).c $@
  186. X   %.c : %.l ; $(LEX)   $(LFLAGS) $<; mv $(LEXYY).c $@
  187. X
  188. # RCS support
  189. .IF $(_HAVE_RCS)
  190. X   % : $$(@:d)RCS$$(DIRSEPSTR)$$(@:f)$V;- $(CO) $(COFLAGS) $@
  191. X   .NOINFER : $$(@:d)RCS$$(DIRSEPSTR)$$(@:f)$V
  192. .END
  193. X
  194. # SCCS support
  195. .IF $(_HAVE_SCCS)
  196. X   % : s.% ; get $@
  197. X   .NOINFER : s.%
  198. .END
  199. X
  200. # DMAKE uses this recipe to remove intermediate targets
  201. .REMOVE :; $(RM) $<
  202. X
  203. # AUGMAKE extensions for SYSV compatibility
  204. @B = $(@:b)
  205. @D = $(@:d)
  206. @F = $(@:f)
  207. "*B" = $(*:b)
  208. "*D" = $(*:d)
  209. "*F" = $(*:f)
  210. <B = $(<:b)
  211. <D = $(<:d)
  212. <F = $(<:f)
  213. ?B = $(?:b)
  214. ?F = $(?:f)
  215. ?D = $(?:d)
  216. X
  217. # Turn warnings back to previous setting.
  218. .SILENT := $(__.SILENT)
  219. X
  220. # Local init file if any, gets parsed before user makefile
  221. .INCLUDE .IGNORE: "_startup.mk"
  222. SHAR_EOF
  223. chmod 0640 dmake/mac/startup.mk ||
  224. echo 'restore of dmake/mac/startup.mk failed'
  225. Wc_c="`wc -c < 'dmake/mac/startup.mk'`"
  226. test 3508 -eq "$Wc_c" ||
  227.     echo 'dmake/mac/startup.mk: original size 3508, current size' "$Wc_c"
  228. rm -f _shar_wnt_.tmp
  229. fi
  230. # ============= dmake/mac/sysintf.h ==============
  231. if test -f 'dmake/mac/sysintf.h' -a X"$1" != X"-c"; then
  232.     echo 'x - skipping dmake/mac/sysintf.h (File already exists)'
  233.     rm -f _shar_wnt_.tmp
  234. else
  235. > _shar_wnt_.tmp
  236. sed 's/^X//' << 'SHAR_EOF' > 'dmake/mac/sysintf.h' &&
  237. /*
  238. ** assorted bits of system interface, for common routines inside dmake.
  239. ** System specific code can be found in the config.h files for each
  240. ** of the system specifications.
  241. */
  242. #define STAT stat
  243. #define VOID_LCACHE(l,m)
  244. #define Hook_std_writes(A)
  245. #define GETPID 1
  246. X
  247. /*
  248. ** standard C items
  249. */
  250. X
  251. /*
  252. ** Mac interface standard items
  253. */
  254. #define getswitchar()   '-'
  255. X
  256. /*
  257. ** make parameters
  258. */
  259. #define MAX_PATH_LEN    1024
  260. SHAR_EOF
  261. chmod 0640 dmake/mac/sysintf.h ||
  262. echo 'restore of dmake/mac/sysintf.h failed'
  263. Wc_c="`wc -c < 'dmake/mac/sysintf.h'`"
  264. test 415 -eq "$Wc_c" ||
  265.     echo 'dmake/mac/sysintf.h: original size 415, current size' "$Wc_c"
  266. rm -f _shar_wnt_.tmp
  267. fi
  268. # ============= dmake/mac/tempnam.c ==============
  269. if test -f 'dmake/mac/tempnam.c' -a X"$1" != X"-c"; then
  270.     echo 'x - skipping dmake/mac/tempnam.c (File already exists)'
  271.     rm -f _shar_wnt_.tmp
  272. else
  273. > _shar_wnt_.tmp
  274. sed 's/^X//' << 'SHAR_EOF' > 'dmake/mac/tempnam.c' &&
  275. /* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/mac/tempnam.c,v 1.1 1992/01/24 03:29:52 dvadura Exp $
  276. -- SYNOPSIS -- Fake tempnam function for the mac
  277. --
  278. -- DESCRIPTION
  279. --  Get a temporary file name.
  280. --
  281. -- AUTHOR
  282. --      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  283. --      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  284. --
  285. --
  286. -- COPYRIGHT
  287. --      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  288. -- 
  289. --      This program is free software; you can redistribute it and/or
  290. --      modify it under the terms of the GNU General Public License
  291. --      (version 1), as published by the Free Software Foundation, and
  292. --      found in the file 'LICENSE' included with this distribution.
  293. -- 
  294. --      This program is distributed in the hope that it will be useful,
  295. --      but WITHOUT ANY WARRANTY; without even the implied warrant of
  296. --      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  297. --      GNU General Public License for more details.
  298. -- 
  299. --      You should have received a copy of the GNU General Public License
  300. --      along with this program;  if not, write to the Free Software
  301. --      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  302. --
  303. -- LOG
  304. --     $Log: tempnam.c,v $
  305. X * Revision 1.1  1992/01/24  03:29:52  dvadura
  306. X * dmake Version 3.8, Initial revision
  307. X *
  308. */
  309. X
  310. X
  311. #include "extern.h"
  312. #include <StdIO.h>
  313. #include <String.h>
  314. X
  315. X
  316. X
  317. /*
  318. X * Try to open a temporary file in the given directory (if non-NULL)
  319. X * with the given prefix (if non-NULL).
  320. X *
  321. X * We ignore the directory argument.
  322. X */
  323. PUBLIC char *tempnam (char * /* pDir */, char * pPrefix) {
  324. X    char *pName;
  325. X    char *pFullName;
  326. X
  327. X    pName = tmpnam ((char *) NULL);
  328. X
  329. X    /* Assume that if the name returned by tmpnam is not being used,
  330. X       the name with the prefix is also not being used. */
  331. X    pFullName = MALLOC (((pPrefix != NULL) ? strlen (pPrefix) : 0) +
  332. X                        strlen (pName) + 1, char);
  333. X
  334. X    /* Copy in the name if we successfully allocated space for it. */
  335. X    if (pFullName != NULL) {
  336. X        if (pPrefix != NULL) {
  337. X            strcpy (pFullName, pPrefix);
  338. X        } else {
  339. X            *pFullName = '\0';
  340. X        } /* if ... else */
  341. X
  342. X        strcat (pFullName, pName);
  343. X    } /* if */
  344. X    
  345. X    return (pFullName);
  346. } /* PUBLIC char *tempnam () */
  347. SHAR_EOF
  348. chmod 0640 dmake/mac/tempnam.c ||
  349. echo 'restore of dmake/mac/tempnam.c failed'
  350. Wc_c="`wc -c < 'dmake/mac/tempnam.c'`"
  351. test 2283 -eq "$Wc_c" ||
  352.     echo 'dmake/mac/tempnam.c: original size 2283, current size' "$Wc_c"
  353. rm -f _shar_wnt_.tmp
  354. fi
  355. # ============= dmake/mac/tomacfil.c ==============
  356. if test -f 'dmake/mac/tomacfil.c' -a X"$1" != X"-c"; then
  357.     echo 'x - skipping dmake/mac/tomacfil.c (File already exists)'
  358.     rm -f _shar_wnt_.tmp
  359. else
  360. > _shar_wnt_.tmp
  361. sed 's/^X//' << 'SHAR_EOF' > 'dmake/mac/tomacfil.c' &&
  362. /* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/mac/tomacfil.c,v 1.1 1992/01/24 03:29:53 dvadura Exp $
  363. -- SYNOPSIS -- Routines to change unix file names to mac file names
  364. --
  365. -- DESCRIPTION
  366. --  Dmake sometimes assumes that files have '/' as a directory parameter in some makefiles.
  367. --  This works, even on DOS, but not on the Mac.  In fact, on the Mac, you can't even do a
  368. --  a simple switch of ':' for '/' because all other the Mac has decided to reverse the use
  369. --  of a first-character directory delimiter to mean a relative path rather than absolute path.
  370. --  (i.e., ':test:b' means directory test is relative to the current directory, rather than
  371. --  a top-level directory.  Thus, this file attempts to do the directory conversion behind
  372. --  the back of the rest of the program.
  373. --
  374. -- AUTHOR
  375. --      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  376. --      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  377. --
  378. --
  379. -- COPYRIGHT
  380. --      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  381. -- 
  382. --      This program is free software; you can redistribute it and/or
  383. --      modify it under the terms of the GNU General Public License
  384. --      (version 1), as published by the Free Software Foundation, and
  385. --      found in the file 'LICENSE' included with this distribution.
  386. -- 
  387. --      This program is distributed in the hope that it will be useful,
  388. --      but WITHOUT ANY WARRANTY; without even the implied warrant of
  389. --      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  390. --      GNU General Public License for more details.
  391. -- 
  392. --      You should have received a copy of the GNU General Public License
  393. --      along with this program;  if not, write to the Free Software
  394. --      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  395. --
  396. -- LOG
  397. --     $Log: tomacfil.c,v $
  398. X * Revision 1.1  1992/01/24  03:29:53  dvadura
  399. X * dmake Version 3.8, Initial revision
  400. X *
  401. */
  402. X
  403. #include "extern.h"
  404. int IsUnixFName (char *pFileName);
  405. X
  406. X
  407. X
  408. /*
  409. X * Convert a file that may be in unix format to mac format.
  410. X *
  411. X * The returned name is either the untouched pUnixName, or a static buffer.
  412. X */
  413. PUBLIC char *Unix2MacFName(char *pUnixName) {
  414. X    static char MacName[256];
  415. X    char *pCurMac;
  416. X
  417. X    if (IsUnixFName (pUnixName)) {
  418. X        if (strlen (pUnixName) + (*pUnixName == '/' ? -1 : 1) >= sizeof (MacName)) {
  419. X            Fatal ("File name '%s' is too long and will cause a buffer overflow", pUnixName);
  420. X        } /* if */
  421. X
  422. X        /* Set up relative or absolute path */
  423. X        pCurMac = MacName;
  424. X        if (*pUnixName == '/') {
  425. X            ++pUnixName;
  426. X        } else {
  427. X            *(pCurMac++) = ':';
  428. X        } /* if ... else */
  429. X
  430. X        /* Convert the rest of the name */
  431. X        while (*pUnixName != '\0') {
  432. X            if (*pUnixName == '/') {
  433. X                *(pCurMac++) = ':';
  434. X                pUnixName++;
  435. X
  436. X            } else {
  437. X                *(pCurMac++) = *(pUnixName++);
  438. X            } /* if ... else */
  439. X        } /* while */
  440. X
  441. X        *pCurMac = '\0';
  442. X        return (MacName);
  443. X
  444. X    } else {
  445. X        return (pUnixName);
  446. X    } /* if ... else */
  447. } /* PUBLIC char *Unix2MacFName() */
  448. X
  449. X
  450. X
  451. /*
  452. X * Is this file name in UNIX format?
  453. X * (We assume it is if there are any slashes in its name.)
  454. X */
  455. int IsUnixFName (char *pFileName) {
  456. X
  457. X    for ( ; *pFileName != '\0'; ++pFileName) {
  458. X        if (*pFileName == '/') {
  459. X            return (TRUE);
  460. X        } /* if */
  461. X    } /* while */
  462. X
  463. X    return (FALSE);
  464. } /* int IsUnixFName () */
  465. X
  466. X
  467. X
  468. /*
  469. X * Call the real fopen() from this override of the function
  470. X * that the rest of the program uses.
  471. X */
  472. #undef fopen
  473. PUBLIC FILE *MacFOpen (char *pFName, char *pMode) {
  474. X    return (fopen (Unix2MacFName (pFName), pMode));
  475. } /* PUBLIC FILE *MacFOpen () */
  476. SHAR_EOF
  477. chmod 0640 dmake/mac/tomacfil.c ||
  478. echo 'restore of dmake/mac/tomacfil.c failed'
  479. Wc_c="`wc -c < 'dmake/mac/tomacfil.c'`"
  480. test 3703 -eq "$Wc_c" ||
  481.     echo 'dmake/mac/tomacfil.c: original size 3703, current size' "$Wc_c"
  482. rm -f _shar_wnt_.tmp
  483. fi
  484. # ============= dmake/macparse.c ==============
  485. if test -f 'dmake/macparse.c' -a X"$1" != X"-c"; then
  486.     echo 'x - skipping dmake/macparse.c (File already exists)'
  487.     rm -f _shar_wnt_.tmp
  488. else
  489. > _shar_wnt_.tmp
  490. sed 's/^X//' << 'SHAR_EOF' > 'dmake/macparse.c' &&
  491. /* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/RCS/macparse.c,v 1.1 1992/01/24 03:27:52 dvadura Exp $
  492. -- SYNOPSIS -- parse a macro definition
  493. -- 
  494. -- DESCRIPTION
  495. --    This file contains the code that parses a macro definition
  496. --    stored in a buffer.  If the string in buffer is not a valid
  497. --    macro definition the routie Parse_macro returns 0, otherwise it
  498. --    returns 1 to indicate success.
  499. -- 
  500. -- AUTHOR
  501. --      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  502. --      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  503. --
  504. -- COPYRIGHT
  505. --      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  506. -- 
  507. --      This program is free software; you can redistribute it and/or
  508. --      modify it under the terms of the GNU General Public License
  509. --      (version 1), as published by the Free Software Foundation, and
  510. --      found in the file 'LICENSE' included with this distribution.
  511. -- 
  512. --      This program is distributed in the hope that it will be useful,
  513. --      but WITHOUT ANY WARRANTY; without even the implied warrant of
  514. --      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  515. --      GNU General Public License for more details.
  516. -- 
  517. --      You should have received a copy of the GNU General Public License
  518. --      along with this program;  if not, write to the Free Software
  519. --      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  520. --
  521. -- LOG
  522. --     $Log: macparse.c,v $
  523. X * Revision 1.1  1992/01/24  03:27:52  dvadura
  524. X * dmake Version 3.8, Initial revision
  525. X *
  526. */
  527. X
  528. #include "extern.h"
  529. X
  530. PUBLIC int
  531. Parse_macro( buffer, flag )/*
  532. =============================
  533. X   Parse the string in buffer and define it as a macro if it is a valid macro.
  534. X   Note especially the string .SETDIR= since it is an attribute, but looks a
  535. X   lot like a macro definition.  This would not be a problem if make used
  536. X   white space as token separators, since this is not the case we must do
  537. X   something about it. */
  538. char *buffer;
  539. int  flag;
  540. {
  541. X   register char *tok1;        /* temporary place to keep a token */
  542. X   register char *tok2;        /* temporary place to keep a token */
  543. X   char         *result;    /* temporary pointer for strings   */
  544. X   TKSTR          input;        /* place to scan the buffer from   */
  545. X   HASHPTR      hv;        /* pointer to hash table value       */
  546. X   int          operator;    /* what macro operator do we have  */
  547. X
  548. X   DB_ENTER( "Parse_macro" );
  549. X
  550. X   SET_TOKEN( &input, buffer );
  551. X   tok1 = Get_token( &input, "=+:*", 0 );
  552. X
  553. X   if( Macro_op( tok1 ) ) {
  554. X      Error( "No macro name" );
  555. X      CLEAR_TOKEN( &input );
  556. X      DB_RETURN( 1 );
  557. X   }
  558. X
  559. X   tok1 = _strdup( tok1 );
  560. X   tok2 = Get_token( &input, "=+:*", 2 );
  561. X   if( !(operator = Macro_op(tok2)) || 
  562. X      (!strcmp(tok1, ".SETDIR") &&
  563. X         ((operator != M_OP_CL) || (operator != M_OP_PLCL) ||
  564. X          (operator != M_OP_DFCL))) ) {
  565. X      CLEAR_TOKEN( &input );
  566. X      FREE( tok1 );
  567. X      DB_RETURN( 0 );
  568. X   }
  569. X
  570. X   tok2 = Expand(tok1); FREE(tok1); tok1 = tok2;
  571. X   tok2 = Get_token( &input, NIL( char ), FALSE );
  572. X
  573. X   switch( operator ) {
  574. X      case M_OP_PLCL:
  575. X      tok2 = Expand( tok2 );
  576. X      /* Fall thru */
  577. X
  578. X      case M_OP_PL:
  579. X     /* Add to an existing macro, if it is not defined, though, then
  580. X      * just define a new macro */
  581. X
  582. X     if( (hv = GET_MACRO(tok1)) == NIL(HASH) || hv->ht_value == NIL(char) )
  583. X        Def_macro( tok1, tok2, flag );
  584. X     else {
  585. X        result = _stradd( hv->ht_value, tok2, FALSE );
  586. X        Def_macro( tok1, result, flag );
  587. X        FREE( result );
  588. X     }
  589. X     if( operator == M_OP_PLCL ) FREE(tok2);
  590. X     break;
  591. X
  592. X      case M_OP_DF:
  593. X      if( (hv = GET_MACRO(tok1)) != NIL(HASH) )
  594. X        break;
  595. X     /* else FALLTHRU */
  596. X
  597. X      case M_OP_EQ:
  598. X     Def_macro( tok1, tok2, flag );
  599. X     break;
  600. X
  601. X      case M_OP_DFCL:
  602. X      if( (hv = GET_MACRO(tok1)) != NIL(HASH) )
  603. X        break;
  604. X     /* else FALLTHRU */
  605. X
  606. X      case M_OP_CL:
  607. X     /* If the macro we are assigning from is a single control
  608. X      * macro with nothing else, then we propagate the M_MULTI
  609. X      * flag to the macro we are assigning the value to so that
  610. X      * the same macro can be used to do this over and over. */
  611. X     If_multi = 0;
  612. X     tok2 = Expand( tok2 );
  613. X     Def_macro( tok1, tok2, M_EXPANDED | flag | If_multi );
  614. X     FREE( tok2 );
  615. X     break;
  616. X   }
  617. X        
  618. X   FREE( tok1 );
  619. X
  620. X   DB_RETURN( 1 );
  621. }
  622. X
  623. X
  624. X
  625. PUBLIC int
  626. Macro_op( op )/*
  627. ================
  628. X   Check the passed in op string and map it to one of the macro operators */
  629. char *op;
  630. {
  631. X   int ret = 0;
  632. X
  633. X   DB_ENTER( "macro_op" );
  634. X
  635. X   switch( *op ) {
  636. X      case '=': ret = M_OP_EQ; break;
  637. X      case ':': ret = M_OP_CL; op++; break;
  638. X
  639. X      case '+':
  640. X         ret = M_OP_PL; op++;
  641. X         if( *op == ':' ) { ret = M_OP_PLCL; op++; }
  642. X         break;
  643. X
  644. X      case '*':
  645. X         ret = M_OP_DF; op++;
  646. X         if( *op == ':' ) { ret = M_OP_DFCL; op++; }
  647. X         break;
  648. X   }
  649. X
  650. X   if( *op++ != '=' )
  651. X      ret = 0;
  652. X   else if( *op != '\0' )
  653. X      ret = 0;
  654. X
  655. X   DB_RETURN( ret );
  656. }
  657. X
  658. SHAR_EOF
  659. chmod 0640 dmake/macparse.c ||
  660. echo 'restore of dmake/macparse.c failed'
  661. Wc_c="`wc -c < 'dmake/macparse.c'`"
  662. test 4782 -eq "$Wc_c" ||
  663.     echo 'dmake/macparse.c: original size 4782, current size' "$Wc_c"
  664. rm -f _shar_wnt_.tmp
  665. fi
  666. # ============= dmake/make.bat ==============
  667. if test -f 'dmake/make.bat' -a X"$1" != X"-c"; then
  668.     echo 'x - skipping dmake/make.bat (File already exists)'
  669.     rm -f _shar_wnt_.tmp
  670. else
  671. > _shar_wnt_.tmp
  672. sed 's/^X//' << 'SHAR_EOF' > 'dmake/make.bat' &&
  673. echo off
  674. cls
  675. rem  *** This is the make batchfile that is used under MSDOS to make the
  676. rem  *** first version of dmake.  It isn't pretty but it does work, assuming
  677. rem  *** the compilers have been correctly setup.  See the warning below
  678. rem  *** concerning tlink, if you are making the Turbo C version.
  679. rem
  680. X
  681. if %0%1 == %0 goto error
  682. if %1 == tcc goto mktcc
  683. if %1 == tccswp goto mktccswp
  684. if %1 == bcc goto mkbcc
  685. if %1 == bccswp goto mkbccswp
  686. if %1 == msc40 goto mkmsc40
  687. if %1 == msc40swp goto mkmsc40swp
  688. if %1 == msc50 goto mkmsc50
  689. if %1 == msc50swp goto mkmsc50swp
  690. if %1 == msc51 goto mkmsc51
  691. if %1 == msc51swp goto mkmsc51swp
  692. if %1 == msc60 goto mkmsc60
  693. if %1 == msc60swp goto mkmsc60swp
  694. if %1 == ztc goto mkztc
  695. if %1 == ztcswp goto mkztcswp
  696. X
  697. rem label the possible DOS variations for dmake here.
  698. :error
  699. echo MSDOS:  You must specify 'make target' where target is one of:
  700. echo -------------
  701. echo    tcc       - Turbo C 2.0 compile.
  702. echo    tccswp    - Turbo C 2.0 compile of swapping dmake.
  703. echo    bcc       - Borland C++ 2.0 compile.
  704. echo    bccswp    - Borland C++ 2.0 compile of swapping dmake.
  705. echo    msc40     - Microsoft C 4.0 compile.
  706. echo    msc50     - Microsoft C 5.0 compile.
  707. echo    msc51     - Microsoft C 5.1 compile.
  708. echo    msc60     - Microsoft C 6.0 compile.
  709. echo    msc40swp  - Microsoft C 4.0, MASM 5.1 compile of swapping dmake.
  710. echo    msc50swp  - Microsoft C 5.0, MASM 5.1 compile of swapping dmake.
  711. echo    msc51swp  - Microsoft C 5.1, MASM 5.1 compile of swapping dmake.
  712. echo    msc60swp  - Microsoft C 6.0, MASM 5.1 compile of swapping dmake.
  713. echo    ztc       - Zortech C++ 2.1 compile.
  714. echo    ztcswp    - Zortech C++ 2.1 compile of swapping dmake.
  715. goto end
  716. X
  717. rem This is the script that makes dmake using Microsoft C 4.0
  718. :mkmsc40
  719. msdos\mscdos\mk40.bat
  720. goto end
  721. X
  722. :mkmsc40swp
  723. msdos\mscdos\mk40swp.bat
  724. goto end
  725. X
  726. rem This is the script that makes dmake using Microsoft C 5.0
  727. :mkmsc50
  728. msdos\mscdos\mk50.bat
  729. goto end
  730. X
  731. :mkmsc50swp
  732. msdos\mscdos\mk50swp.bat
  733. goto end
  734. X
  735. rem This is the script that makes dmake using Microsoft C 5.1
  736. :mkmsc51
  737. msdos\mscdos\mk51.bat
  738. goto end
  739. X
  740. :mkmsc51swp
  741. msdos\mscdos\mk51swp.bat
  742. goto end
  743. X
  744. rem This is the script that makes dmake using Microsoft C 6.0
  745. :mkmsc60
  746. msdos\mscdos\mk60.bat
  747. goto end
  748. X
  749. :mkmsc60swp
  750. msdos\mscdos\mk60swp.bat
  751. goto end
  752. X
  753. rem This is the script that makes dmake using Zortech C++ 2.1
  754. :mkztc
  755. msdos\ztcdos\mk.bat
  756. goto end
  757. X
  758. :mkztcswp
  759. msdos\ztcdos\mkswp.bat
  760. goto end
  761. X
  762. rem This is the script that makes dmake using Turbo C 2.0 or higher.
  763. :mktcc
  764. cls
  765. echo WARNING:
  766. echo    The default response files:
  767. echo        msdos\tccdos\obj.rsp
  768. echo        msdos\tccdos\lib.rsp
  769. echo    contain absolute paths to TURBO-C runtime startup objects, and to
  770. echo    the standard libraries.  You should check that these files contain
  771. echo    the correct path names for your installation of Turbo-C before
  772. echo    proceeding further.  Also check that the mkdir command at the start
  773. echo    of the response file and the copy command at the end of the response
  774. echo    file will work on your system.
  775. echo --
  776. echo Continue if ok, or abort and edit the response files.
  777. pause
  778. msdos\tccdos\mk.bat
  779. goto end
  780. X
  781. :mktccswp
  782. cls
  783. echo WARNING:
  784. echo    The default response files:
  785. echo        msdos\tccdos\objswp.rsp
  786. echo        msdos\tccdos\libswp.rsp
  787. echo    contain absolute paths to TURBO-C runtime startup objects, and to
  788. echo    the standard libraries.  You should check that these files contain
  789. echo    the correct path names for your installation of Turbo-C before
  790. echo    proceeding further.  Also check that the mkdir command at the start
  791. echo    of the response file and the copy command at the end of the response
  792. echo    file will work on your system.
  793. echo --
  794. echo Continue if ok, or abort and edit the response files.
  795. pause
  796. msdos\tccdos\mkswp.bat
  797. goto end
  798. X
  799. rem This is the script that makes dmake using Turbo C++ 2.0.
  800. :mkbcc
  801. cls
  802. echo WARNING:
  803. echo    The default response files:
  804. echo        msdos\bccdos\obj.rsp
  805. echo        msdos\bccdos\lib.rsp
  806. echo    contain absolute paths to Borland C++ runtime startup objects, and to
  807. echo    the standard libraries.  You should check that these files contain
  808. echo    the correct path names for your installation of Borland C++ before
  809. echo    proceeding further.  Also check that the mkdir command at the start
  810. echo    of the response file and the copy command at the end of the response
  811. echo    file will work on your system.
  812. echo --
  813. echo Continue if ok, or abort and edit the response files.
  814. pause
  815. msdos\bccdos\mk.bat
  816. goto end
  817. X
  818. :mkbccswp
  819. cls
  820. echo WARNING:
  821. echo    The default response files:
  822. echo        msdos\bccdos\objswp.rsp
  823. echo        msdos\bccdos\libswp.rsp
  824. echo    contain absolute paths to Borland C++ runtime startup objects, and to
  825. echo    the standard libraries.  You should check that these files contain
  826. echo    the correct path names for your installation of Borland C++ before
  827. echo    proceeding further.  Also check that the mkdir command at the start
  828. echo    of the response file and the copy command at the end of the response
  829. echo    file will work on your system.
  830. echo --
  831. echo Continue if ok, or abort and edit the response files.
  832. pause
  833. msdos\bccdos\mkswp.bat
  834. goto end
  835. X
  836. rem All done!
  837. :end
  838. SHAR_EOF
  839. chmod 0640 dmake/make.bat ||
  840. echo 'restore of dmake/make.bat failed'
  841. Wc_c="`wc -c < 'dmake/make.bat'`"
  842. test 5188 -eq "$Wc_c" ||
  843.     echo 'dmake/make.bat: original size 5188, current size' "$Wc_c"
  844. rm -f _shar_wnt_.tmp
  845. fi
  846. # ============= dmake/make.c ==============
  847. if test -f 'dmake/make.c' -a X"$1" != X"-c"; then
  848.     echo 'x - skipping dmake/make.c (File already exists)'
  849.     rm -f _shar_wnt_.tmp
  850. else
  851. > _shar_wnt_.tmp
  852. sed 's/^X//' << 'SHAR_EOF' > 'dmake/make.c' &&
  853. /* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/RCS/make.c,v 1.1 1992/01/24 03:26:51 dvadura Exp $
  854. -- SYNOPSIS -- perform the update of all outdated targets.
  855. -- 
  856. -- DESCRIPTION
  857. --    This is where we traverse the make graph looking for targets that
  858. --    are out of date, and we try to infer how to make them if we can.
  859. --    The usual make macros are understood, as well as some new ones:
  860. --
  861. --        $$    - expands to $
  862. --        $@      - full target name
  863. --        $*      - target name with no suffix, same as $(@:db)
  864. --              or, the value of % in % meta rule recipes
  865. --        $?      - list of out of date prerequisites
  866. --        $<      - all prerequisites associated with rules line
  867. --        $&    - all prerequisites associated with target
  868. --        $>      - library name for target (if any)
  869. --        $^    - out of date prerequisites taken from value of $<
  870. --        {{    - expands to {
  871. --        }}    - expands to }
  872. --        \#    - expands to #
  873. -- 
  874. -- AUTHOR
  875. --      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  876. --      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  877. --
  878. -- COPYRIGHT
  879. --      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  880. -- 
  881. --      This program is free software; you can redistribute it and/or
  882. --      modify it under the terms of the GNU General Public License
  883. --      (version 1), as published by the Free Software Foundation, and
  884. --      found in the file 'LICENSE' included with this distribution.
  885. -- 
  886. --      This program is distributed in the hope that it will be useful,
  887. --      but WITHOUT ANY WARRANTY; without even the implied warrant of
  888. --      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  889. --      GNU General Public License for more details.
  890. -- 
  891. --      You should have received a copy of the GNU General Public License
  892. --      along with this program;  if not, write to the Free Software
  893. --      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  894. --
  895. -- LOG
  896. --     $Log: make.c,v $
  897. X * Revision 1.1  1992/01/24  03:26:51  dvadura
  898. X * dmake Version 3.8, Initial revision
  899. X *
  900. */
  901. X
  902. #include "extern.h"
  903. X
  904. static    void    _drop_mac ANSI((HASHPTR));
  905. static    void    _set_recipe ANSI((char*, int));
  906. static    void    _set_tmd ANSI(());
  907. static    void    _append_file ANSI((STRINGPTR, FILE*, char*, int));
  908. static  LINKPTR _dup_prq ANSI((LINKPTR));
  909. static  char*   _prefix ANSI((char *, char *));
  910. static  char*   _pool_lookup ANSI((char *));
  911. X
  912. #define RP_GPPROLOG    0
  913. #define RP_RECIPE    1
  914. #define RP_GPEPILOG    2
  915. #define NUM_RECIPES    3
  916. X
  917. static STRINGPTR _recipes[ NUM_RECIPES ];
  918. X
  919. X
  920. PUBLIC int
  921. Make_targets()/*
  922. ================
  923. X   Actually go and make the targets on the target list */
  924. {
  925. X   LINKPTR lp;
  926. X   int     done = 0;
  927. X
  928. X   DB_ENTER( "Make_targets" );
  929. X
  930. X   Read_state();
  931. X   _set_recipe( ".GROUPPROLOG", RP_GPPROLOG );
  932. X   _set_recipe( ".GROUPEPILOG", RP_GPEPILOG );
  933. X
  934. X   Root->ce_flag  |= F_RULES|F_TARGET|F_STAT;
  935. X   Root->ce_attr  |= A_NOSTATE;
  936. X   Root->ce_time   = Do_time();
  937. X   TALLOC( Root->ce_recipe, 1, STRING );
  938. X   Root->ce_recipe->st_string = "";
  939. X
  940. X   for( lp = Root->ce_prq; lp != NIL(LINK); lp = lp->cl_next )
  941. X      lp->cl_prq->ce_attr |= A_ROOT;
  942. X
  943. X   while( !done ) {
  944. X      int rval;
  945. X
  946. X      if( (rval = Make(Root, NIL(CELL))) == -1 )
  947. X     DB_RETURN(1);
  948. X      else
  949. X     done = Root->ce_flag & F_MADE;
  950. X
  951. X      if( !rval && !done ) Wait_for_child( FALSE, -1 );
  952. X   }
  953. X
  954. X   for( lp = Root->ce_prq; lp != NIL(LINK); lp = lp->cl_next ) {
  955. X      CELLPTR root = lp->cl_prq;
  956. X      if( !(root->ce_attr & A_UPDATED) )
  957. X     printf( "`%s' is up to date\n", root->CE_NAME );
  958. X   }
  959. X
  960. X   DB_RETURN( 0 );
  961. }
  962. X
  963. X
  964. X
  965. int
  966. Make( cp, setdirroot )/*
  967. ========================  Make a specified target */
  968. CELLPTR cp;
  969. CELLPTR setdirroot;
  970. {
  971. X   register LINKPTR dp;
  972. X   register CELLPTR tcp;
  973. X   CELLPTR          nsetdirroot;
  974. X   char            *name, *lib;
  975. X   HASHPTR        m_at, m_q, m_b, m_g, m_l, m_bb, m_up;
  976. X   char             *all    = NIL(char);
  977. X   char             *inf    = NIL(char);
  978. X   char             *outall = NIL(char);
  979. X   char             *imm    = NIL(char);
  980. X   int              rval    = 0;
  981. X   int            push    = 0;
  982. X   int             made    = F_MADE;
  983. X   int            ignore;
  984. X   time_t           otime   = (time_t) 1L;
  985. X   time_t        ttime   = (time_t) 1L;
  986. X   int            mark_made = FALSE;
  987. X
  988. X   DB_ENTER( "Make" );
  989. X   DB_PRINT( "mem", ("%s:-> mem %ld", cp->CE_NAME, (long) coreleft()) );
  990. X
  991. X   m_q = m_b = m_g = m_l = m_bb = m_up = m_at = NIL(HASH);
  992. X
  993. X   /* If we are supposed to change directories for this target then do so.
  994. X    * If we do change dir, then modify the setdirroot variable to reflect
  995. X    * that fact for all of the prerequisites that we will be making. */
  996. X
  997. X   nsetdirroot = setdirroot;
  998. X   ignore = (((cp->ce_attr|Glob_attr)&A_IGNORE) != 0);
  999. X
  1000. X   if( cp->ce_attr & A_SETDIR ) {
  1001. X      /* Change directory only if the previous .SETDIR is a different
  1002. X       * directory from the current one.  ie. all cells with the same .SETDIR
  1003. X       * attribute are assumed to come from the same directory. */
  1004. X
  1005. X      if( (setdirroot == NIL(CELL) || setdirroot->ce_dir != cp->ce_dir) &&
  1006. X          (push = Push_dir(cp->ce_dir,cp->CE_NAME,ignore)) )
  1007. X     setdirroot = cp;
  1008. X   }
  1009. X
  1010. X   DB_PRINT( "mem", ("%s:-A mem %ld", cp->CE_NAME, (long) coreleft()) );
  1011. X   if( cp->ce_recipe == NIL(STRING) ) {
  1012. X      char *dir = cp->ce_dir;
  1013. X      
  1014. X      if( Verbose & V_MAKE )
  1015. X     printf( "%s:  Infering prerequisite(s) and recipe for [%s]\n", Pname,
  1016. X          cp->CE_NAME );
  1017. X
  1018. X      Infer_recipe( cp, setdirroot );
  1019. X
  1020. X      /* See if the directory has changed, if it has then make sure we
  1021. X       * push it. */
  1022. X      if( dir != cp->ce_dir ) {
  1023. X     if( push ) Pop_dir(FALSE);
  1024. X         push = Push_dir( cp->ce_dir, cp->CE_NAME, ignore );
  1025. X     setdirroot = cp;
  1026. X      }
  1027. X   }
  1028. X
  1029. X   tcp = cp;
  1030. X   do {
  1031. X      if( push ) {
  1032. X     if( tcp->ce_dir ) FREE( tcp->ce_dir );
  1033. X     tcp->ce_dir   = _pool_lookup(Pwd);
  1034. X     tcp->ce_attr |= A_SETDIR;
  1035. X      }
  1036. X      tcp->ce_setdir = nsetdirroot;
  1037. X      tcp = tcp->ce_all;
  1038. X   }
  1039. X   while( tcp != NIL(CELL) && tcp != cp );
  1040. X
  1041. X   DB_PRINT( "mem", ("%s:-A mem %ld", cp->CE_NAME, (long) coreleft()) );
  1042. X   /* If we have not yet statted the target then do so. */
  1043. X   if( !(cp->ce_flag & F_STAT) && !(cp->ce_attr&A_PHONY) ) {
  1044. X      time_t itime = cp->ce_time;
  1045. X      Stat_target( cp, TRUE );
  1046. X
  1047. X      if( cp->ce_time == (time_t)0L ) {
  1048. X         if( cp->ce_flag & F_INFER )
  1049. X        cp->ce_time = itime;
  1050. X      }
  1051. X      else
  1052. X         cp->ce_attr |= A_PRECIOUS;  /* File exists so don't remove it later. */
  1053. X
  1054. X      if( Verbose & V_MAKE )
  1055. X     printf("%s:  Time stamp of [%s] is %ld\n",Pname,cp->CE_NAME,
  1056. X            cp->ce_time);
  1057. X   }
  1058. X
  1059. X   DB_PRINT( "make", ("(%s, %ld, 0x%08x, 0x%04x)", cp->CE_NAME,
  1060. X            cp->ce_time, cp->ce_attr, cp->ce_flag) );
  1061. X
  1062. X   if( !(cp->ce_flag & F_TARGET) && (cp->ce_time == (time_t) 0L) )
  1063. X      if( Makemkf ) {
  1064. X     rval = -1;
  1065. X     goto stop_making_it;
  1066. X      }
  1067. X      else if(cp->ce_prq != NIL(LINK)||(Augmake && (cp->ce_flag&F_EXPLICIT)))
  1068. X     /* Assume an empty recipe for a target that we have run inference on
  1069. X      * but do not have a set of rules for but for which we have inferred
  1070. X      * a list of prerequisites. */
  1071. X     cp->ce_flag |= F_RULES;
  1072. X      else
  1073. X     Fatal( "`%s' not found, and can't be made", cp->CE_NAME );
  1074. X
  1075. X   DB_PRINT( "mem", ("%s:-A mem %ld", cp->CE_NAME, (long) coreleft()) );
  1076. X
  1077. X   /* set value of $* if we have not infered a recipe, in this case $* is
  1078. X    * the same as $(@:db), this allows us to be compatible with BSD make */
  1079. X   if( cp->ce_per == NIL(char) ) cp->ce_per = "$(@:db)";
  1080. X
  1081. X   for( dp = cp->ce_prq; dp != NIL(LINK); dp = dp->cl_next ) {
  1082. X      int seq;
  1083. X
  1084. X      /* Make the prerequisite, note that if the current target has the
  1085. X       * .LIBRARY attribute set we pass on to the prerequisite the .LIBRARYM
  1086. X       * attribute and pass on the name of the current target as the library
  1087. X       * name, and we take it away when we are done.  */
  1088. X
  1089. X      tcp = dp->cl_prq;
  1090. X      seq = (((cp->ce_attr | Glob_attr) & A_SEQ) != 0);
  1091. X
  1092. X      if( tcp->ce_flag & F_VISITED )
  1093. X     if( _explode_graph(tcp, dp, setdirroot) == 0 ) {
  1094. X        /* didn't blow it up so see if we need to wait for it. */
  1095. X        if( tcp->ce_flag & F_MADE ) {
  1096. X           if( tcp->ce_time > ttime ) ttime = tcp->ce_time;
  1097. X           continue;
  1098. X        }
  1099. X        else
  1100. X           goto stop_making_it;
  1101. X     }
  1102. X     else
  1103. X        tcp = dp->cl_prq;
  1104. X
  1105. X      if( seq && !made ) goto stop_making_it;
  1106. X
  1107. X      if( strchr(tcp->CE_NAME, '$') ) {
  1108. X     /* Make this prerequisite link point at the real prerequisite we
  1109. X      * are after, ie figure out what the dynamic one is and point at it. */
  1110. X
  1111. X     m_at = Def_macro( "@", cp->ce_fname, M_MULTI );
  1112. X     name = Expand( tcp->CE_NAME );
  1113. X     if( strcmp(name,cp->CE_NAME) == 0 )
  1114. X        Fatal( "Circular dynamic dependency generated '%s'", name );
  1115. X
  1116. X     tcp = dp->cl_prq = Def_cell( name );
  1117. X     FREE( name );
  1118. X      }
  1119. X
  1120. X      if( cp->ce_attr & A_LIBRARY ) {
  1121. X         tcp->ce_attr |= A_LIBRARYM;
  1122. X     tcp->ce_lib   = cp->ce_fname;
  1123. X      }
  1124. X
  1125. X      if( (tcp->ce_flag & (F_INFER|F_STAT))==F_INFER && cp->ce_time >= ttime )
  1126. X     tcp->ce_time = cp->ce_time;
  1127. X
  1128. X      /* Propagate parents F_REMOVE and F_INFER attribute to children.
  1129. X       * Make certain you do this AFTER propagating the time, since the
  1130. X       * time propagation test above uses the F_INFER flag to decide if
  1131. X       * it should do so. */
  1132. X      tcp->ce_flag |= cp->ce_flag & (F_REMOVE|F_INFER);
  1133. X
  1134. X      rval |= Make(tcp, setdirroot);
  1135. X
  1136. X      if( cp->ce_attr & A_LIBRARY )
  1137. X         tcp->ce_attr ^= A_LIBRARYM;
  1138. X
  1139. X      if( rval == -1 || (seq && (rval==1)) )
  1140. X     goto stop_making_it;
  1141. X
  1142. X      if( tcp->ce_time > ttime ) ttime = tcp->ce_time;
  1143. X      made &= tcp->ce_flag & F_MADE;
  1144. X   }
  1145. X
  1146. X
  1147. X   /* Do the loop again.  We are most definitely going to make the current
  1148. X    * cell now.  NOTE:  doing this loop here also results in a reduction
  1149. X    * in peak memory usage by the algorithm. */
  1150. X
  1151. X   for( dp = cp->ce_prq; dp != NIL(LINK); dp = dp->cl_next ) {
  1152. X      int  tgflg;
  1153. X      tcp  = dp->cl_prq;
  1154. X      name = tcp->ce_fname;
  1155. X
  1156. X      /* make certain that all prerequisites are made prior to advancing. */
  1157. X      if( !(tcp->ce_flag & F_MADE) ) goto stop_making_it;
  1158. X
  1159. X      /* If the target is a library, then check to make certain that a member
  1160. X       * is newer than an object file sitting on disk.  If the disk version
  1161. X       * is newer then set the time stamps so that the archived member is
  1162. X       * replaced. */
  1163. X      if( cp->ce_attr & A_LIBRARY )
  1164. X     if( tcp->ce_time < cp->ce_time ) {
  1165. X        time_t mtime = Do_stat( name, tcp->ce_lib, NIL(char *) );
  1166. X        if( mtime < tcp->ce_time ) tcp->ce_time = cp->ce_time+1L;
  1167. X     }
  1168. X
  1169. X      if( tcp->ce_time > otime ) otime = tcp->ce_time;
  1170. X
  1171. X      all = _strapp( all, name );
  1172. X      if( tgflg = (dp->cl_flag & F_TARGET) ) inf = _strapp( inf, name );
  1173. X
  1174. X      if((cp->ce_time<tcp->ce_time) || ((tcp->ce_flag & F_TARGET) && Force)) {
  1175. X         outall = _strapp( outall, name );
  1176. X         if( tgflg ) imm = _strapp( imm, name );
  1177. X      }
  1178. X   }
  1179. X
  1180. X   DB_PRINT( "mem", ("%s:-C mem %ld", cp->CE_NAME, (long) coreleft()) );
  1181. X   DB_PRINT( "make", ("I make '%s' if %ld > %ld", cp->CE_NAME, otime,
  1182. X          cp->ce_time) );
  1183. X
  1184. X   if( Verbose & V_MAKE && !(cp->ce_flag & F_MULTI) ) {
  1185. X      printf( "%s:  >>>> Making ", Pname );
  1186. X      if( cp->ce_count != 0 )
  1187. X     printf( "[%s::{%d}]\n", cp->CE_NAME, cp->ce_count );
  1188. X      else
  1189. X     printf( "[%s]\n", cp->CE_NAME );
  1190. X   }
  1191. X
  1192. X   m_at = Def_macro( "@", cp->ce_fname, M_MULTI|M_EXPANDED );
  1193. X   m_g  = Def_macro( ">", cp->ce_lib,   M_MULTI|M_EXPANDED );
  1194. X   m_q  = Def_macro( "?", outall,       M_MULTI|M_EXPANDED );
  1195. X   m_b  = Def_macro( "<", inf,          M_MULTI|M_EXPANDED );
  1196. X   m_l  = Def_macro( "&", all,          M_MULTI|M_EXPANDED );
  1197. X   m_up = Def_macro( "^", imm,          M_MULTI|M_EXPANDED );
  1198. X   m_bb = Def_macro( "*", cp->ce_per,   M_MULTI );
  1199. X
  1200. X   _recipes[ RP_RECIPE ] = cp->ce_recipe;
  1201. X
  1202. X   /* We attempt to make the target if
  1203. X    *   1. it has a newer prerequisite
  1204. X    *   2. It is a target and Force is set
  1205. X    *   3. It's set of recipe lines has changed.
  1206. X    */
  1207. X   if(    Check_state(cp, _recipes, NUM_RECIPES )
  1208. X      || (cp->ce_time < otime)
  1209. X      || ((cp->ce_flag & F_TARGET) && Force)
  1210. X     ) {
  1211. X
  1212. X      /* Only checking so stop as soon as we determine we will make something */
  1213. X      if( Check ) {
  1214. X     rval = -1;
  1215. X     goto stop_making_it;
  1216. X      }
  1217. X
  1218. X      if( Verbose & V_MAKE )
  1219. X     printf( "%s:  Updating [%s], (%ld > %ld)\n", Pname,
  1220. X         cp->CE_NAME, otime, cp->ce_time );
  1221. X
  1222. X      if( Touch ) {
  1223. X     name = cp->ce_fname;
  1224. X     lib  = cp->ce_lib;
  1225. X
  1226. X     if( !(Glob_attr & A_SILENT) || !Trace )
  1227. X        if( lib == NIL(char) )
  1228. X           printf("touch(%s)", name );
  1229. X        else if( cp->ce_attr & A_SYMBOL )
  1230. X           printf("touch(%s((%s)))", lib, name );
  1231. X        else
  1232. X           printf("touch(%s(%s))", lib, name );
  1233. X
  1234. X     if( !Trace )
  1235. X        if( Do_touch( name, lib,
  1236. X        (cp->ce_attr & A_SYMBOL) ? &name : NIL(char *) ) != 0 )
  1237. X           printf( "  not touched - non-existant" );
  1238. X
  1239. X     printf( "\n" );
  1240. X     Update_time_stamp( cp );
  1241. X      }
  1242. X      else if( cp->ce_recipe != NIL(STRING) ) {
  1243. X     if( !(cp->ce_flag & F_SINGLE) )
  1244. X           rval = Exec_commands( cp );
  1245. X     else {
  1246. X        TKSTR tk;
  1247. X
  1248. X        _drop_mac( m_q );
  1249. X
  1250. X        if( outall && *outall ) {
  1251. X           SET_TOKEN( &tk, outall );
  1252. X
  1253. X           Doing_bang = TRUE;
  1254. X           name = Get_token( &tk, "", FALSE );
  1255. X           do {
  1256. X          m_q->ht_value = name;
  1257. X
  1258. X          Wait_for_completion = TRUE;    /* Reset in Exec_commands */
  1259. X          rval = Exec_commands( cp );
  1260. X          Unlink_temp_files(cp);
  1261. X           }
  1262. X           while( *(name = Get_token( &tk, "", FALSE )) != '\0' );
  1263. X           Doing_bang = FALSE;
  1264. X        }
  1265. X
  1266. X        Update_time_stamp( cp );
  1267. X        m_q->ht_value = NIL(char);
  1268. X     }
  1269. X      }
  1270. X      else if( !(cp->ce_flag & F_RULES) && !(cp->ce_flag & F_STAT) &&
  1271. X           (!(cp->ce_attr & A_ROOT) || !(cp->ce_flag & F_EXPLICIT)) )
  1272. X     Fatal( "Don't know how to make `%s'",cp->CE_NAME );
  1273. X      else {
  1274. X         /* Empty recipe, set the flag as MADE and update the time stamp */
  1275. X     Update_time_stamp( cp );
  1276. X      }
  1277. X   }
  1278. X   else
  1279. X      mark_made = TRUE;
  1280. X
  1281. X   /* Make sure everyone gets remade if Force is set */
  1282. X   tcp = cp;
  1283. X   do {
  1284. X      if( !(tcp->ce_flag & F_TARGET) && Force ) tcp->ce_time = Do_time();
  1285. X      if( mark_made ) {
  1286. X     tcp->ce_flag |= F_MADE;
  1287. X     if( tcp->ce_flag & F_MULTI ) {
  1288. X        LINKPTR dp;
  1289. X        for( dp = tcp->ce_prq; dp != NIL(LINK); dp = dp->cl_next )
  1290. X           tcp->ce_attr |= dp->cl_prq->ce_attr & A_UPDATED;
  1291. SHAR_EOF
  1292. true || echo 'restore of dmake/make.c failed'
  1293. fi
  1294. echo 'End of part 12, continue with part 13'
  1295. echo 13 > _shar_seq_.tmp
  1296. exit 0
  1297. exit 0 # Just in case...
  1298.